home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_11_08
/
1108064a
< prev
next >
Wrap
Text File
|
1993-06-06
|
6KB
|
236 lines
short edmask1[3][3] = {{0, 1, 0},
{0, 1, 0},
{0, 1, 0}};
short edmask2[3][3] = {{0, 0, 0},
{1, 1, 1},
{0, 0, 0}};
short edmask3[3][3] = {{0, 1, 0},
{1, 1, 1},
{0, 1, 0}};
short edmask4[3][3] = {{1, 1, 1},
{1, 1, 1},
{1, 1, 1}};
/*******************************************
*
* mask_dilation(...
*
* This function performs the dilation
* operation using the erosion-dilation
* 3x3 masks given above. It works on
* 0-value images.
*
*******************************************/
mask_dilation(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
int length, width;
struct tiff_header_struct image_header;
short mask[3][3], max;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
if(does_not_exist(out_name)){
printf("\n\n output file does not exist %s", out_name);
read_tiff_header(in_name, &image_header);
round_off_image_size(&image_header,
&length, &width);
image_header.image_length = length*ROWS;
image_header.image_width = width*COLS;
create_allocate_tiff_file(out_name, &image_header,
out_image);
} /* ends if does_not_exist */
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
max = 0;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(mask[a+1][b+1] == 1){
if(the_image[i+a][j+b] > max)
max = the_image[i+a][j+b];
} /* ends if mask == 1 */
} /* ends loop over b */
} /* ends loop over a */
out_image[i][j] = max;
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends mask_dilation */
/*******************************************
*
* mask_erosion(...
*
* This function performs the erosion
* operation using the erosion-dilation
* 3x3 masks given above. It works on
* 0-value images.
*
*******************************************/
mask_erosion(in_name, out_name, the_image, out_image,
il, ie, ll, le, value, mask_type)
char in_name[], out_name[];
int il, ie, ll, le;
short the_image[ROWS][COLS],
out_image[ROWS][COLS],
mask_type, value;
{
int a, b, count, i, j, k;
int length, width;
struct tiff_header_struct image_header;
short mask[3][3], min;
/**************************************
*
* Copy the 3x3 erosion-dilation mask
* specified by the mask_type.
*
***************************************/
switch(mask_type){
case 1:
copy_3_x_3(mask, edmask1);
break;
case 2:
copy_3_x_3(mask, edmask2);
break;
case 3:
copy_3_x_3(mask, edmask3);
break;
case 4:
copy_3_x_3(mask, edmask4);
break;
default:
printf("\nInvalid mask type, using mask 4");
copy_3_x_3(mask, edmask4);
break;
}
if(does_not_exist(out_name)){
printf("\n\n output file does not exist %s", out_name);
read_tiff_header(in_name, &image_header);
round_off_image_size(&image_header,
&length, &width);
image_header.image_length = length*ROWS;
image_header.image_width = width*COLS;
create_allocate_tiff_file(out_name, &image_header,
out_image);
} /* ends if does_not_exist */
read_tiff_image(in_name, the_image, il, ie, ll, le);
/***************************
*
* Loop over image array
*
****************************/
printf("\n");
for(i=1; i<ROWS-1; i++){
if( (i%10) == 0) printf("%3d", i);
for(j=1; j<COLS-1; j++){
min = value;
for(a=-1; a<=1; a++){
for(b=-1; b<=1; b++){
if(mask[a+1][b+1] == 1){
if(the_image[i+a][j+b] < min)
min = the_image[i+a][j+b];
} /* ends if mask == 1 */
} /* ends loop over b */
} /* ends loop over a */
out_image[i][j] = min;
} /* ends loop over j */
} /* ends loop over i */
fix_edges(out_image, 3);
write_array_into_tiff_image(out_name, out_image,
il, ie, ll, le);
} /* ends mask_erosion */
/***********************************************
*
* copy_3_x_3(a, b)
*
* This function copies a 3x3 array of shorts
* from one array to another. It copies array
* b into array a.
*
***********************************************/
copy_3_x_3(a, b)
short a[3][3], b[3][3];
{
int i, j;
for(i=0; i<3; i++)
for(j=0; j<3; j++)
a[i][j] = b[i][j];
} /* ends copy_3_x_3 */